package com.agv.core.dao.ctb;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.springframework.jdbc.core.JdbcTemplate;

import com.agv.core.dao.IGridPojoDao;
import com.agv.core.dao.dataExtractor.CatalogosResultSetExtractor;

import com.agv.core.dao.dataExtractor.TypesAndDataRowMapper;
import com.agv.core.exception.AgvException;

import com.agv.core.util.Constantes;
import com.agv.core.util.GridPojo;
import com.agv.core.util.Util;


public class PolizasEstandarDaoImpl implements IGridPojoDao {

	private JdbcTemplate jdbcTemplate;



	@SuppressWarnings("unchecked")
	public GridPojo findFirstGrid(Object[] params) throws AgvException {

		try {

			Properties properties = Util
					.getProperties(Constantes.AGV_CONTABILIDAD_TRANSACCIONES);

			GridPojo pojo = new GridPojo();
			List<Map<String, Object>> datosTabla = new ArrayList<Map<String, Object>>();

			Map<String, String> datosCombo = new HashMap<String, String>();
			Map<String, Map<String, String>> combos = new HashMap<String, Map<String, String>>();

			datosTabla = (List<Map<String, Object>>) jdbcTemplate.query(
					properties.getProperty("agv.ctb.trn.listaPolizas"),params,
					new TypesAndDataRowMapper());

			pojo.setDatosTabla(datosTabla);
			pojo.setNombreTabla(properties
					.getProperty("agv.ctb.trn.nomTablaPrincipal"));

			pojo.setSecuencia(properties
					.getProperty("agv.ctb.trn.nomSecPrincipal"));
			pojo.setNombreTablaSegundoGrid(properties
					.getProperty("agv.ctb.trn.nomTablaSecundaria"));

			String[] filas = properties.getProperty("agv.ctb.trn.tipoSaldo")
					.split("\\|");
			for (int i = 0; i < filas.length; i++) {
				String[] clabeValor = filas[i].split(",");
				datosCombo.put(clabeValor[0], clabeValor[1]);
			}

			combos.put(properties.getProperty("agv.ctb.trn.tipoSaldo.campo"),
					datosCombo);

			// Origen de poliza
			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.ctb.trn.origenPoliza"),
					new CatalogosResultSetExtractor());
			combos.put(
					properties.getProperty("agv.ctb.trn.origenPoliza.campo"),
					datosCombo);

			// categoria de poliza
			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.ctb.trn.categoriaPoliza"),
					new CatalogosResultSetExtractor());
			combos.put(properties
					.getProperty("agv.ctb.trn.categoriaPoliza.campo"),
					datosCombo);

			// configuracion de calendario
			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.ctb.trn.confCalendario"),
					new CatalogosResultSetExtractor());
			combos.put(properties
					.getProperty("agv.ctb.trn.confCalendario.campo"),
					datosCombo);

			// periodo reversion utiliza los mismos datos que la configuracion
			// del calendario
			combos.put(properties
					.getProperty("agv.ctb.trn.periodoReversion.campo"),
					datosCombo);

			// tipo moneda
			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.ctb.trn.tipoMoneda"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.ctb.trn.tipoMoneda.campo"),
					datosCombo);

			// tipo de cambio
			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.ctb.trn.tipoCambio"),
					new CatalogosResultSetExtractor());
			combos.put(properties.getProperty("agv.ctb.trn.tipoCambio.campo"),
					datosCombo);

			// columnas boolean
			String[] columnas = properties.getProperty(
					"agv.ctb.trn.columnasBoolean.obtieneListaPolizas").split(
					",");
			pojo.setBooleanos(Arrays.asList(columnas));

			pojo.setCatalogos(combos);
			return pojo;

		} catch (Exception e) {

			e.printStackTrace();
			throw new AgvException(e);
		}

	}

	@SuppressWarnings("unchecked")
	public GridPojo findSecondGrid(Object[] params) throws AgvException {

		try {

			Properties properties = Util
					.getProperties(Constantes.AGV_CONTABILIDAD_TRANSACCIONES);

			GridPojo pojo = new GridPojo();
			List<Map<String, Object>> datosTabla = new ArrayList<Map<String, Object>>();

			Map<String, String> datosCombo = new HashMap<String, String>();
			Map<String, Map<String, String>> combos = new HashMap<String, Map<String, String>>();

			datosTabla = (List<Map<String, Object>>) jdbcTemplate.query(
					properties.getProperty("agv.ctb.trn.listaLineaPolizas"),
					params, new TypesAndDataRowMapper());

			pojo.setDatosTabla(datosTabla);
			pojo.setNombreTablaSegundoGrid(properties
					.getProperty("agv.ctb.trn.nomTablaSecundaria"));
			pojo.setSecuencia(properties
					.getProperty("agv.ctb.trn.nomSecSecundaria"));

			// Cuenta contable
			datosCombo = (Map<String, String>) jdbcTemplate.query(properties
					.getProperty("agv.ctb.trn.cuentaContable"),
					new CatalogosResultSetExtractor());
			combos.put(properties
					.getProperty("agv.ctb.trn.cuentaContable.campo"),
					datosCombo);

			pojo.setCatalogos(combos);
			return pojo;

		} catch (Exception e) {
			throw new AgvException(e);
		}
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}



}
